package com.duckclouddrive.task;


import com.duckclouddrive.entity.enums.FileDelFlagEnums;
import com.duckclouddrive.entity.po.FileInfo;
import com.duckclouddrive.entity.query.FileInfoQuery;
import com.duckclouddrive.service.FileInfoService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Component
public class FileCleanTask {

    // 使用Resource注解注入FileInfoService依赖，用于处理文件信息相关操作
    @Resource
    private FileInfoService fileInfoService;

    // 定义一个定时任务方法，固定延迟3分钟执行一次
    @Scheduled(fixedDelay = 1000 * 60 * 3)
    public void execute() {
        // 创建FileInfoQuery对象，用于查询回收站内已删除的文件信息
        FileInfoQuery fileInfoQuery = new FileInfoQuery();
        fileInfoQuery.setDelFlag(FileDelFlagEnums.RECYCLE.getFlag());
        fileInfoQuery.setQueryExpire(true);

        // 查询符合查询条件的文件信息列表
        List<FileInfo> fileInfoList = fileInfoService.findListByParam(fileInfoQuery);

        // 将查询结果根据userId分组，便于后续批量处理每个用户的文件
        Map<String, List<FileInfo>> fileInfoMap = fileInfoList.stream().collect(Collectors.groupingBy(FileInfo::getUserId));

        // 遍历分组后的文件信息，对每个用户的文件进行批量删除操作
        for (Map.Entry<String, List<FileInfo>> entry : fileInfoMap.entrySet()) {
            // 提取当前用户的所有文件ID，用于批量删除
            List<String> fileIds = entry.getValue().stream().map(p -> p.getFileId()).collect(Collectors.toList());

            // 调用服务方法进行批量删除操作，不立即物理删除文件
            fileInfoService.delFileBatch(entry.getKey(), String.join(",", fileIds), false);
        }
    }
}
